#include <iostream>
#include <time.h>
#include <stdlib.h>
#include<exception>
#include <vector>
// #include "stack.h"
// #include "stacklist.h"
// using namespace stack_array;
#include <stack>
#if 0
int main() {
    stack stack;
    srand(time(nullptr));
    for (int i = 0; i < 15; i++) {
        stack.push(rand()%100);
    }
    std::cout<<"栈的容量："<<stack.capacity()<<"栈的大小:"<<stack.size()<<std::endl;
    stack.print();
    for (int i = 0; i < 15; i++) {
        try {
            const int top = stack.topValue();
            std::cout<<top<<std::endl;
            stack.pop();
            stack.print();
        }catch (std::runtime_error e) {
            std::cout<<e.what()<<std::endl;
        }
    }

    return 0;
}
#endif //数组形式弄栈结构
# if 0
int main() {
    stack_lsit::stacklist stack;
    srand(time(nullptr));
    for (int i = 0; i < 15; i++) {
        stack.push((rand()%100));
    }
    stack.print();
    for (int i = 0; i < 16; i++) {
        try {
            std::cout<<"栈顶元素是:"<<stack.top()<<std::endl;
            stack.pop();
            stack.print();
        }catch (std::runtime_error e) {
            std::cout<<e.what()<<std::endl;
        }
    }
    return 0;
}
#endif
#if 0
//判断括号是不是匹配
/**
 * 判断给定的字符串中的括号是否有效匹配
 * @param s 输入的字符串，包含各种括号字符
 * @return 如果所有括号都正确匹配则返回true，否则返回false
 */
bool isValid(std::string s) {
    std::stack<char> stack;  // 创建一个字符栈用于存储左括号

    // 遍历字符串中的每个字符
    for(char& c :s){
        // 如果是左括号，则压入栈中
        if(c=='('||c=='{'||c=='['){
            stack.push(c);
        }else{
            // 如果遇到右括号时栈为空，说明没有对应的左括号
            if (stack.empty()) {
                return false;
            }
            //获取栈顶的元素
            const char top  = stack.top();
            // 检查左右括号是否匹配
            if((top == '('&&c ==')')||(top=='['&&c==']')||(top=='{'&&c=='}')){
                stack.pop();  // 匹配成功则弹出栈顶元素
            }else{
                // 不匹配则返回false
                return false;
            }
        }
    }
    // 如果栈为空，说明所有括号都正确匹配；否则有未闭合的左括号
    return stack.empty();
}
#endif

 //逆波兰表达式求值
/**
 * 使用逆波兰表达式（后缀表达式）求值
 * @param tokens 输入的token数组，包含数字和运算符
 * @return 计算结果
 */
int evalRPN(const std::vector<std::string>& tokens) {
    std::stack<int> stack;  // 创建一个整型栈用于存储中间结果
    // 遍历所有的token
    for (const std::string& token : tokens) {
        // 如果token是运算符
        if (token == "+" || token == "-" || token == "*" || token == "/") {
            const int b = stack.top();  // 获取栈顶元素作为第二个操作数
            stack.pop();                // 弹出栈顶元素
            const int a = stack.top();  // 获取栈顶元素作为第一个操作数
            stack.pop();                // 弹出栈顶元素
            // 根据不同的运算符进行相应的计算
            switch (token[0]) {
                case '+':
                    stack.push(a + b);  // 加法运算
                    break;
                case '-':
                    stack.push(a - b);  // 减法运算
                    break;
                case '*':
                    stack.push(a * b);  // 乘法运算
                    break;
                case '/':
                    stack.push(a / b);  // 除法运算
                    break;
            }
        } else {
            // 如果token是数字，将其转换为整数并压入栈中
            stack.push(std::stoi(token));
        }
    }
    // 栈中最后一个元素就是最终的计算结果
    return stack.top();
    }



int main() {
    // std::cout<<isValid("([)")<<std::endl;
    std::vector<std::string> tokens = {"2", "1", "+", "3", "*"};
    std::cout<<evalRPN(tokens)<<std::endl;
    return 0;
}